/*
 * @Author: 杰编程 2306248989@qq.com
 * @Date: 2023-07-28 19:41:43
 * @LastEditors: 杰编程 2306248989@qq.com
 * @LastEditTime: 2023-07-28 20:13:38
 * @FilePath: /lesson21/mythread.cc
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
#include <iostream>

using namespace std;

#include <unistd.h>
#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

void *PthreadRoutine(void *args)
{
    const char *name = static_cast<const char *>(args);
    while (true)
    {
        pthread_mutex_lock(&mutex);
        pthread_cond_wait(&cond, &mutex); // 挂起等待，等待某个条件满足，等待其它线程唤醒该线程
        cout << name << " run" << endl;
        pthread_mutex_unlock(&mutex);
    }
}
int main()
{
    pthread_t t[4];
    for (int i = 0; i < 4; ++i)
    {
        char *name = new char[64];
        snprintf(name, 64, "thread-%d", i + 1);
        pthread_create(t + i, nullptr, PthreadRoutine, name);
    }
    sleep(3);

    while (true)
    {
        //pthread_cond_signal(&cond); // 唤醒一个线程
        pthread_cond_broadcast(&cond); // 唤醒所有线程
        sleep(1);
    }

    for (int i = 0; i < 4; ++i)
    {
        pthread_join(t[i], nullptr);
    }

    return 0;
}

// pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
// void* PthreadRoutine(void* args)
// {
//     const char* name=static_cast<const char*>(args);
//     while(true)
//     {
//         pthread_mutex_lock(&mutex);
//         cout<<name<<" run"<<endl;
//     }
// }
// int main()
// {
//     pthread_t t[4];
//     for(int i=0;i<4;++i)
//     {
//         char* name=new char[64];
//         snprintf(name,64,"thread-%d",i+1);
//         pthread_create(t+i,nullptr,PthreadRoutine,name);
//     }

//     while(true)
//     {
//         pthread_mutex_unlock(&mutex);//解锁操作可以在任意一个线程中进行
//         sleep(1);
//     }
//     for(int i=0;i<4;++i)
//     {
//         pthread_join(t[i],nullptr);
//     }

//     return 0;
// }